package com.jxud.service.impl;

import com.jxud.config.MinioConfig;
import com.jxud.service.MinioService;
import io.minio.*;
import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

@Slf4j
@Service
public class MinioServiceImpi implements MinioService {
    @Value("${minio.product-file}")
    private String productFile;

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minioConfig;


    @Override
    public String uploadFile(MultipartFile file) throws MinioException, IOException, NoSuchAlgorithmException, InvalidKeyException {
        // 1. 获取原始文件名和扩展名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            throw new IllegalArgumentException("文件名不能为空");
        }
        String fileExtension = "";
        int lastDotIndex = originalFilename.lastIndexOf('.');
        if (lastDotIndex > 0) {
            fileExtension = originalFilename.substring(lastDotIndex); // 包含点号，如 .jpg
        }

        // 2. 生成唯一的对象名 (防止文件名冲突)
        // 这里使用 UUID 作为文件名，你也可以根据业务需求生成
        String uniqueObjectName = productFile + "/" + UUID.randomUUID() + fileExtension;

        // 3. 确保存储桶存在，如果不存在则创建
        createBucketIfNotExists();

        // 4. 执行上传
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(minioConfig.getBucketName()) // 指定存储桶
                        .object(uniqueObjectName) // 指定对象名 (文件在 MinIO 中的路径/名称)
                        .stream(file.getInputStream(), file.getSize(), -1) // 上传流，指定大小
                        .contentType(file.getContentType()) // 设置内容类型
                        .build()
        );

        String URL= "/" + minioConfig.getBucketName() + '/'+ uniqueObjectName;
        log.info("图片上传成功返回的文件名:{}",URL);
        // 5. 返回生成的唯一对象名，后续可用于访问或删除
        return URL;
    }

    /**
     * 检查并创建存储桶（如果不存在）
     */
    private void createBucketIfNotExists() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioConfig.getBucketName()).build());
        if (!found) {
            // 创建存储桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioConfig.getBucketName()).build());
            System.out.println("存储桶 '" + minioConfig.getBucketName() + "' 创建成功。");
        }
    }

}
